package com.lnt.spring.dependencies;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * 循环依赖测试2
 * 1.实例化CircularServiceTest2 ---- >得到一个CircularServiceTest2对象
 * 2.填充CircularServiceTest2的属性 ---- > 去单例池中去找CircularServiceTest1 ----> 没有则创建
 * 3.填充其他属性
 * 4.初始化前，初始化
 * 5.初始化后
 * 6.放入单例池
 */
@Component
public class CircularServiceTest2 {

    @Autowired
    private CircularServiceTest1 circularServiceTest1;

    public void test(){
        System.out.println(circularServiceTest1);
    }

    @Override
    public String toString() {
        return "CircularServiceTest2纳入bean容器管理:" +
                "\n 1.创建CircularServiceTest2:" +
                "\n \t || 将CircularServiceTest2放入到createSet中表示该对象正在被创建" +
                "\n \t || 实例化CircularServiceTest2 ---->得到一个对象" +
                "\n \t || 将上边得到的对象,beanName，beanDefinition放入(singletonFactories<beanName(String), lambda(原始对象/AOP代理对象)>[三级缓存])中" +
                "\n 2.填充CircularServiceTest2的属性:" +
                "\n \t || 发现CircularServiceTest2中存在另一个bean对象CircularServiceTest1" +
                "\n \t || 去单例池中去取" +
                "\n \t || 如果存在则赋值;不存在就去createSet中获取，如果存在,则表示该属性所对应的bean对象正在被创建,那么就代表出现了循环依赖" +
                "\n \t || 此时就去earySingletonObjects[二级缓存]中去找" +
                "\n \t || \t || 如果二级缓存中没有则去三级缓存 singletonFactories 中去找,因为bean对象是在属性填充前被放入singletonFactories中的,所以一定存在," +
                "\n \t || \t || 获取singletonFactories<beanName, lamdba(原始对象,AOP代理对象)>中的Value，Value是一个lambda表达式，然后执行Value(lambda表达式)" +
                "\n \t || \t || 执行后返回一个对象(代理对象/原始对象),将返回的对象存入到earySingletonObjects[二级缓存]中" +
                "\n \t || 此时就通过earySingletonObjects[二级缓存]中拿到了CircularServiceTest1的残缺对象，并赋值" +
                "\n 3.填充其他属性" +
                "\n 4.初始化前" +
                "\n 4.初始化" +
                "\n 5.初始化后" +
                "\n 6.完成创建,将CircularServiceTest2放入单例池SingletonObject[一级缓存中]" +
                "\n ============================END====================================";
    }
}
